// 调用myPromise
const MyPromise = require('./myPromise')

/**
 * test1 - 普通promise
 */
// let promise = new MyPromise((resolve, reject) => {
//   resolve('success') // 二者只有其一
//   // reject('failed') // 二者只有其一
// })
// promise.then(value => {
//   console.log(value)
// }, error => {
//   console.log(error)
// })

/**
 * test2 - 处理异步
 */
// let promise = new MyPromise((resolve, reject) => {
//   setTimeout(() => {
//     resolve('success')
//     // reject('failed')
//   }, 2000);
// })
// promise.then(value => {
//   console.log(value, '异步')
// }, error => {
//   console.log(error, '异步')
// })

/**
 * test3 - then 多次调用
 */
// let promise = new MyPromise((resolve, reject) => {
//   resolve('success')
//   // reject('failed')
// })
// let promise = new MyPromise((resolve, reject) => {
//   setTimeout(() => {
//     resolve('success')
//     // reject('failed')
//   }, 2000);
// })
// promise.then(value => {
//   console.log(value, '第一次value')
// }, error => {
//   console.log(error, '第一次error')
// })
// promise.then(value => {
//   console.log(value, '第二次value')
// }, error => {
//   console.log(error, '第二次error')
// })
// promise.then(value => {
//   console.log(value, '第三次value')
// }, error => {
//   console.log(error, '第三次error')
// })

/**
 * test4 链式调用
 * 1. 每个then都返回promise
 * 2. 将上一个then的返回值传递到下一个then中
 * 3. 区分返回的是普通值还是promsie对象
 */
// let promise = new MyPromise((resolve, reject) => {
//   resolve('success')
//   // reject('failed')
// })
// function other() {
//   return new MyPromise((resolve, reject) => {
//     resolve('other')
//   })
// }
// promise.then(value => {
//   console.log(value)
//   // return 1
//   return other()
// }, error => {
//   console.log(error)
// }).then(value => {
//   console.log(value)
// }, error => {
//   console.log(error)
// })

/**
 * test5 promise 识别返回自己，需抛出异常
 */
// let promise = new MyPromise((resolve, reject) => {
//   resolve('success') // 二者只有其一
//   // reject('failed') // 二者只有其一
// })
// let p1 = promise.then(value => {
//   console.log(value)
//   return p1 // 自己返回自己
// }, error => {
//   console.log(error)
// })
// p1.then(value => {
//   console.log(value)
// }, error => {
//   console.log(error)
// })

/**
 * test6 捕获错误
 * 1. 执行器错误
 * 2. then中抛出错误，在下一个then中拿到
 * 3. 状态为失败的错误
 */
// let promise = new MyPromise((resolve, reject) => {
//   // 1. 执行器错误
//   // throw new Error('执行器错误')

//   // 2. then中抛出错误，在下一个then中拿到
//   // resolve('success')

//   // 3.状态为失败的错误
//   reject('failed')
// })
// promise.then(value => {
//   console.log(value)
//   // 2. then中抛出错误，在下一个then中拿到
//   // throw new Error('then中错误')
// }, error => {
//   console.log(error)
//   // 3. 由于是reject，因此会走到这里，可以测试一下在这里的返回值是否可以继续传递下去
//   return 1
//   // throw new Error('错误中错误')
// }).then(value => {
//   console.log(value)
// }, error => {
//   // 2. then中抛出错误，在下一个then中拿到
//   console.log(error, '拿到上一个then的错误')
// })

/**
 * test7 then 链式调用异步处理
 */
// let promise = new MyPromise((resolve, reject) => {
//   setTimeout(() => {
//     resolve('success')
//     // reject('failed')
//   }, 2000);
// })
// promise.then(value => {
//   console.log(value)
//   return 'value'
// }, error => {
//   console.log(error)
//   return 'error'
// }).then(value => {
//   console.log(value, '上一个then 成功')
// }, error => {
//   console.log(error, '上一个then 错误')
// })

/**
 * test8 then 方法的参数为可选参数
 */
// let promise = new MyPromise((resolve, reject) => {
//   resolve('success')
//   // reject('failed')
// })
// promise.then().then().then(value => console.log(value, '最终value'), reason => console.log(reason, '最终reason'))


/**
 * test9 finally.all
 * 返回的顺序以传递的顺序为准，若状态都成功则成功，只要有一个失败则失败
 */
// function p1() {
//   return new MyPromise((resolve, reject) => {
//     setTimeout(() => resolve('p1'), 2000)
//   })
// }
// function p2() {
//   return new MyPromise((resolve, reject) => {
//     resolve('p2')
//   })
// }
// MyPromise.all(['a', 'b', p1, p2, 'c']).then(result => console.log(result))

/**
 * test10 promise.resolve
 * 将给定值转为 promise 对象
 */
// function p1() {
//   return new MyPromise((resolve, reject) => {
//     setTimeout(() => resolve('p1'), 2000)
//   })
// }
// MyPromise.resolve(100).then(value => console.log(value))
// MyPromise.resolve(p1()).then(value => console.log(value))

/**
 * test11 finally 方法
 * 1. 状态成功与否都要执行
 * 2. finally 方法后可链式调用 then 方法，拿到最终值
 */
// function p1() {
//   return new MyPromise((resolve, reject) => {
//     setTimeout(() => resolve('p1'), 2000)
//   })
// }
// function p2() {
//   return new MyPromise((resolve, reject) => {
//     resolve('p2-resolve')
//     // reject('p2-reject')
//   })
// }
// p2().finally(() => {
//   console.log('finally')
//   return p1() // 如果return p1(), 期望p1执行完成后，后面的then才执行
// }).then(value => {
//   console.log(value)
// }, reason => {
//   console.log(reason)
// })

/**
 * test 12 catch 方法
 */
function p2() {
  return new MyPromise((resolve, reject) => {
    reject('失败了')
  })
}
p2().then(value => console.log(value))
.catch(error => console.log(error))
